package pe.com.cotelasa.scp.dominio.servicio.impl;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;

import javax.inject.Inject;

import java.util.logging.Logger;

import org.springframework.stereotype.Service;

import pe.com.cotelasa.common.dao.excepcion.DAOException;
import pe.com.cotelasa.scp.dao.IDAOCompraFacturacion;
import pe.com.cotelasa.scp.dominio.common.COLOR_ESTADO_VENTA;
import pe.com.cotelasa.scp.dominio.common.ESTADO_REGISTRO;
import pe.com.cotelasa.scp.dominio.common.ESTADO_RESULTADO;
import pe.com.cotelasa.scp.dominio.common.ResultadoServicio;
import pe.com.cotelasa.scp.dominio.excepcion.ServiceException;
import pe.com.cotelasa.scp.dominio.service.IServicioCompraFacturacion;
import pe.com.cotelasa.scp.entidad.CompraFacturacion;
import pe.com.cotelasa.scp.entidad.DetalleCompraFacturacion;
import pe.com.cotelasa.seguridad.common.util.Constantes.EstadoRegistro;

@Service
public class ServicioCompraFacturacionImpl implements IServicioCompraFacturacion, Serializable {
 
	private static final long serialVersionUID = -2745928337749596703L;
	
	@Inject
    IDAOCompraFacturacion daoCompraFacturacion;

    public CompraFacturacion obtenerFacturaPorNumero(String numeroFactura) throws ServiceException {
        try {
            return daoCompraFacturacion.obtenerFacturaPorNumero(numeroFactura);
        } catch (DAOException ex) {
            throw new ServiceException(ex.getMessage(), ex);
        }
    }

    @Override
    public Collection<CompraFacturacion> listarFacturasActivas() throws ServiceException {
        try {
            return daoCompraFacturacion.listarActivos(CompraFacturacion.class);
        } catch (DAOException ex) {
            throw new ServiceException(ex.getMessage(), ex);
        }

    }

    @Override
    public void agregarDetalleCompraFacturacion(Integer id, DetalleCompraFacturacion detalle) throws ServiceException {
    }

    @Override
    public Collection<CompraFacturacion> listarCompraFacturacionPorFiltro(CompraFacturacion factura) throws ServiceException {
        try {

            //if (factura.getIdOrdenPedido() != null) {
            Map<String, Object> parametro = new HashMap<String, Object>();
            if (factura.getIdOrdenPedido() != null) {
                parametro.put("idOrdenPedido", factura.getIdOrdenPedido().getId());
            }
            parametro.put("numeroFactura", factura.getNumeroFactura());
            parametro.put("tipoCompPago", factura.getTipoCompPago());
            parametro.put("idEmpresa", factura.getIdEmpresa().getId());
            parametro.put("estadoRegistro", "" + ESTADO_REGISTRO.ACTIVO.getValor());
            return daoCompraFacturacion.obtenerColeccionEntidadPorFiltros(CompraFacturacion.class, parametro);
            /*}else{
                
             return daoCompraFacturacion.obtenerFacturasProduccion();
             }*/


        } catch (DAOException ex) {
            throw new ServiceException(ex.getMessage(), ex);
        }
    }

    @Override
    public Collection<CompraFacturacion> buscarCompraFacturacionPorFiltro(CompraFacturacion factura, Date fechaInicio, Date fechaFinal) throws ServiceException {
        try {
            return daoCompraFacturacion.buscarCompraFacturacionPorFiltro(factura, fechaInicio, fechaFinal);
        } catch (DAOException ex) {
            throw new ServiceException(ex.getMessage(), ex);
        }
    }

    @Override
    public ResultadoServicio actualizarCompraFacturacion(CompraFacturacion factura) throws ServiceException {
        ResultadoServicio resultadoServicio = new ResultadoServicio(ESTADO_RESULTADO.EXITOSO);
        try {
            daoCompraFacturacion.actualizar(factura);
        } catch (DAOException ex) {
            ex.printStackTrace();
            Logger.getLogger(ServicioOrdenCompraServicioImpl.class.getName()).log(Level.SEVERE, null, ex);
        }
        return resultadoServicio;
    }

    @Override
    public ResultadoServicio guardarCompraFacturacion(CompraFacturacion factura) throws ServiceException {
        ResultadoServicio resultadoServicio = new ResultadoServicio(ESTADO_RESULTADO.EXITOSO);
        try {
            //ordenCS.setId(5);
            if (factura.getIdOrdenPedido().getId() == 0) {
                factura.setIdOrdenPedido(null);
            }

            factura.setEstadoRegistro(ESTADO_REGISTRO.ACTIVO.getValor());
            daoCompraFacturacion.insertar(factura);
        } catch (DAOException ex) {
            ex.printStackTrace();
            resultadoServicio.setEstadoResultado(ESTADO_RESULTADO.FALLIDO);
            resultadoServicio.setMensaje("Ocurrio un problema al tratar de guardar el ordenCS.");
            Logger.getLogger(ServicioOrdenCompraServicioImpl.class.getName()).log(Level.SEVERE, null, ex);
        }
        return resultadoServicio;
    }

    @Override
    public CompraFacturacion conseguirCompraFacturacionPorId(Integer idFactura) throws ServiceException {
        try {
            return daoCompraFacturacion.obtenerEntidadPorId(CompraFacturacion.class, idFactura);
        } catch (DAOException ex) {
            throw new ServiceException(ex.getMessage(), ex);
        }
    }

    @Override
    public Collection<CompraFacturacion> listarFacturasNoPagadas(String solicitante) throws ServiceException {
        //Se deberia listar las facturas por algun filtro que identifique que pertenece a un solo movimiento              

        Map<String, Object> parametros = new HashMap<String, Object>();
        parametros.put("estadoCancelacion", "N");
        parametros.put("estadoRegistro", "" + ESTADO_REGISTRO.ACTIVO.getValor());

        try {
            return daoCompraFacturacion.obtenerColeccionCacheEntidadPorFiltros(CompraFacturacion.class, parametros);
        } catch (DAOException ex) {
            throw new ServiceException(ex.getMessage(), ex);
        }
    }

    @Override
    public CompraFacturacion conseguirMasAntiguo(int idEmpresa) throws ServiceException {
        try {
            return daoCompraFacturacion.conseguirMasAntiguo(idEmpresa);
        } catch (DAOException ex) {
            throw new ServiceException(ex.getMessage(), ex);
        }
    }

    @Override
    public CompraFacturacion conseguirMasNuevo(int idEmpresa) throws ServiceException {
        try {
            return daoCompraFacturacion.conseguirMasNuevo(idEmpresa);
        } catch (DAOException ex) {
            throw new ServiceException(ex.getMessage(), ex);
        }
    }

    @Override
    public BigDecimal buscarMontoPorMes(DetalleCompraFacturacion detalle, Date fecha, int idEmpresa) throws ServiceException {
        try {
            return daoCompraFacturacion.buscarMontoPorMes(detalle, fecha, idEmpresa);
        } catch (DAOException ex) {
            throw new ServiceException(ex.getMessage(), ex);
        }
    }

	@Override
	public Collection<CompraFacturacion> obtenerFacturasCompraParaLetras(
			CompraFacturacion compraFacturacion) throws ServiceException {
		try {
			String tipoPago  = "LETRA";
			String estadoCancelacion = String.valueOf(COLOR_ESTADO_VENTA.EMITIDO.getEstado());
            return daoCompraFacturacion.buscarFacturasParaLetras(compraFacturacion.getIdProveedor().getId(),
            		compraFacturacion.getIdTipoMoneda().getId(), tipoPago, estadoCancelacion, EstadoRegistro.ESTADO_REGISTRO_ACTIVO);
        } catch (DAOException ex) {
            throw new ServiceException(ex.getMessage(), ex);
        }
	}
	
	
	@Override
	public Collection<CompraFacturacion> obtenerCompraFacturacion(
			CompraFacturacion compraFacturacion) throws ServiceException {
		try {
			String estadoCancelacion = String.valueOf(COLOR_ESTADO_VENTA.EMITIDO.getEstado());
            return daoCompraFacturacion.obtenerCompraFacturacion(compraFacturacion.getIdProveedor().getId(),
            		compraFacturacion.getIdTipoMoneda().getId(), estadoCancelacion, EstadoRegistro.ESTADO_REGISTRO_ACTIVO,compraFacturacion.getNumeroFactura());
        } catch (DAOException ex) {
            throw new ServiceException(ex.getMessage(), ex);
        }
	}
	
	@Override
	public void cancelarFactura(CompraFacturacion compraFacturacion)
			throws ServiceException {
		try {
			CompraFacturacion compraFacturacionUpdate = daoCompraFacturacion.obtenerEntidadPorId(CompraFacturacion.class,compraFacturacion.getId());
			compraFacturacionUpdate.setFecCancelacion(compraFacturacion.getFecCancelacion());
			compraFacturacionUpdate.setEstadoCancelacion(COLOR_ESTADO_VENTA.PAGADA.getEstado());
			daoCompraFacturacion.actualizar(compraFacturacionUpdate);
		} catch (Exception e) {
			throw new ServiceException(e.getMessage(),e);
		}
		
	}
}
